from django.contrib.auth.backends import ModelBackend
from django.db.models import Q
from .models import User


# 继承自 ModelBackend, 重写 authenticate 函数
class UsernameMobileAuthBackend(ModelBackend):
    """自定义用户认证后端, 设置用户名和手机号两种登录方式"""

    def authenticate(self, request, username=None, password=None, **kwargs):
        # 自定义验证用户是否存在的函数:
        # 根据传入的 username 获取 user 对象
        # username 可以是手机号也可以是账号
        try:
            user = User.objects.get(
                Q(username=username) | Q(mobile=username)
            )
        except User.DoesNotExist as e:
            # 如果用户不存在，则返回None
            return None

        # 如果密码正确, 则返回用户对象
        if user.check_password(password):
            return user
